/**
 * NPC心情系统
 * 管理NPC心情状态和生成对话
 */

import aiService from '../ai-service.js'

class NPCMoodSystem {
  constructor() {
    // 心情状态定义
    this.moods = {
      happy: { level: 80, emoji: '😊', color: '#FFD700', name: '开心' },
      sad: { level: 30, emoji: '😢', color: '#4169E1', name: '难过' },
      angry: { level: 20, emoji: '😠', color: '#DC143C', name: '生气' },
      calm: { level: 50, emoji: '😌', color: '#90EE90', name: '平静' },
      excited: { level: 90, emoji: '🤩', color: '#FF69B4', name: '兴奋' }
    }
    
    // 默认对话（AI失败时使用）
    this.fallbackDialogues = {
      happy: ['今天天气真不错！', '心情很好呢~', '有什么我能帮你的吗？'],
      sad: ['唉...', '最近心情不太好...', '别理我...'],
      angry: ['哼！', '别烦我！', '走开！'],
      calm: ['嗯...', '什么事？', '随便...'],
      excited: ['哇！', '太棒了！', '我超开心！']
    }
    
    // NPC数据
    this.npcs = this.initNPCs()
  }

  /**
   * 初始化NPC
   */
  initNPCs() {
    return {
      mysterious_figure: {
        id: 'mysterious_figure',
        name: '神秘人',
        avatar: '👤',
        personality: '神秘、智慧',
        mood: 'calm',
        moodLevel: 50,
        friendship: 0,
        unlocked: false
      },
      robinson: {
        id: 'robinson',
        name: '老鲁滨逊',
        avatar: '👴',
        personality: '经验丰富、友善',
        mood: 'happy',
        moodLevel: 70,
        friendship: 0,
        unlocked: false
      },
      parrot: {
        id: 'parrot',
        name: '鹦鹉波利',
        avatar: '🦜',
        personality: '活泼、话多',
        mood: 'excited',
        moodLevel: 85,
        friendship: 0,
        unlocked: false
      }
    }
  }

  /**
   * 获取NPC当前状态
   */
  getNPCState(npcId) {
    const savedState = uni.getStorageSync(`npc_${npcId}`)
    if (savedState) {
      return JSON.parse(savedState)
    }
    
    return this.npcs[npcId] || null
  }

  /**
   * 更新NPC心情
   */
  updateMood(npcId, action) {
    const npc = this.getNPCState(npcId)
    if (!npc) return null
    
    // 行为对心情的影响
    const moodChanges = {
      gift: +10,          // 送礼物
      chat: +5,           // 聊天
      help: +15,          // 帮助
      ignore: -5,         // 忽视
      insult: -20         // 侮辱
    }
    
    const change = moodChanges[action] || 0
    npc.moodLevel = Math.max(0, Math.min(100, npc.moodLevel + change))
    
    // 更新心情状态
    npc.mood = this.calculateMoodState(npc.moodLevel)
    
    // 更新好感度
    if (change > 0) {
      npc.friendship = Math.min(100, npc.friendship + Math.abs(change))
    }
    
    // 保存状态
    uni.setStorageSync(`npc_${npcId}`, JSON.stringify(npc))
    
    return {
      npc: npc,
      change: change,
      newMood: npc.mood,
      newLevel: npc.moodLevel
    }
  }

  /**
   * 计算心情状态
   */
  calculateMoodState(level) {
    if (level >= 80) return 'happy'
    if (level >= 60) return 'excited'
    if (level >= 40) return 'calm'
    if (level >= 20) return 'sad'
    return 'angry'
  }

  /**
   * 生成心情描述（AI + 回退）
   */
  async generateMoodDescription(npcId, reason = '') {
    const npc = this.getNPCState(npcId)
    if (!npc) return '...'
    
    try {
      // 尝试AI生成
      const prompt = `${npc.name}现在的心情是${this.moods[npc.mood].name}。
原因：${reason || '正常'}
用10-20字简短描述他/她的心情状态，要符合${npc.personality}的性格。
格式：纯文本，不要标点符号`

      const aiText = await this.generateAIText(prompt)
      
      if (aiText && aiText.length >= 5 && aiText.length <= 20) {
        return aiText
      }
      
      // 验证失败
      throw new Error('AI生成不符合要求')
      
    } catch (error) {
      console.warn('AI生成失败，使用默认描述')
      return this.getRandomFallback(npc.mood)
    }
  }

  /**
   * 生成随机对话
   */
  async generateDialogue(npcId, context = {}) {
    const npc = this.getNPCState(npcId)
    if (!npc) return '...'
    
    // 对话类型池
    const dialogueTypes = ['greeting', 'weather', 'advice', 'story', 'joke', 'question']
    const type = this.selectDialogueType(npc.mood, context)
    
    try {
      const prompt = `${npc.name}是一个${npc.personality}的角色。
当前心情：${this.moods[npc.mood].name}
当前场景：${context.scene || '海滩'}
对话类型：${type}
请生成一句简短对话（15字内），符合角色性格。
格式：纯文本`

      const aiText = await this.generateAIText(prompt)
      
      if (aiText && aiText.length <= 15) {
        return {
          text: aiText,
          type: type,
          npc: npc.name,
          mood: npc.mood,
          source: 'ai'
        }
      }
      
      throw new Error('AI对话生成失败')
      
    } catch (error) {
      return {
        text: this.getRandomFallback(npc.mood),
        type: type,
        npc: npc.name,
        mood: npc.mood,
        source: 'preset'
      }
    }
  }

  /**
   * AI文本生成辅助方法
   */
  async generateAIText(prompt) {
    try {
      const response = await aiService.generateEvent({
        hp: 100,
        hunger: 50,
        energy: 50,
        day: 1,
        contextPrompt: prompt
      })
      
      if (response && response.scene) {
        return response.scene.slice(0, 20)
      }
      
      return null
    } catch (error) {
      console.error('AI生成失败:', error)
      return null
    }
  }

  /**
   * 选择对话类型
   */
  selectDialogueType(mood, context) {
    if (mood === 'happy' || mood === 'excited') {
      return Math.random() > 0.5 ? 'joke' : 'story'
    } else if (mood === 'sad') {
      return 'question'
    } else if (mood === 'angry') {
      return 'greeting'
    } else {
      return 'advice'
    }
  }

  /**
   * 获取随机默认对话
   */
  getRandomFallback(mood) {
    const dialogues = this.fallbackDialogues[mood] || ['...']
    return dialogues[Math.floor(Math.random() * dialogues.length)]
  }

  /**
   * 获取心情信息
   */
  getMoodInfo(mood) {
    return this.moods[mood] || this.moods.calm
  }

  /**
   * 解锁NPC
   */
  unlockNPC(npcId) {
    const npc = this.getNPCState(npcId)
    if (npc) {
      npc.unlocked = true
      uni.setStorageSync(`npc_${npcId}`, JSON.stringify(npc))
      return npc
    }
    return null
  }

  /**
   * 获取所有已解锁的NPC
   */
  getUnlockedNPCs() {
    const unlockedNPCs = []
    
    for (const npcId in this.npcs) {
      const npc = this.getNPCState(npcId)
      if (npc && npc.unlocked) {
        unlockedNPCs.push(npc)
      }
    }
    
    return unlockedNPCs
  }
}

// 导出单例
const npcMoodSystem = new NPCMoodSystem()
export default npcMoodSystem 